# 【一】引入
# ● 在上面的实例中，一些交互动作都是针对某个节点执行的。
#   ○ 比如，对于输入框，我们就调用它的输入文字和清空文字方法；
#   ○ 对于按钮，就调用它的点击方法。
#   ○ 其实，还有另外一些操作，它们没有特定的执行对象，
#     ■ 比如鼠标拖曳、键盘按键等，
#     ■ 这些动作用另一种方式来执行，
#     ■ 那就是动作链。

# 【二】动作链的操作
# 【1】模拟鼠标操作
"""
操作	函数
右击	context_click()
双击	double_click()
拖拽	double_and_drop()
悬停	move_to_element()
执行	perform()
左击	click()
"""

# 【2】模拟键盘操作
from selenium.webdriver.common.keys import Keys

'''
操作	函数
删除键	send_keys(Keys.BACK_SPACE)
空格键	send_keys(Keys.SPACE)
制表键	send_keys(Keys.TAB)
回退键	send_keys(Keys.ESCAPE)
回车	send_keys(Keys.ENTER)
全选	send_keys(Keys.CONTRL,‘a’)
复制	send_keys(Keys.CONTRL,‘c’)
剪切	send_keys(Keys.CONTRL,‘x’)
粘贴	send_keys(Keys.CONTRL,‘v’)
键盘F1	send_keys(Keys.F1)
'''

# 【3】监听事件
'''
# 鼠标左键单击
click(on_element=None) 

# 单击鼠标左键，不松开
click_and_hold(on_element=None) 

# 单击鼠标右键
context_click(on_element=None)  

# 双击鼠标左键
double_click(on_element=None)      

# 拖拽到某个元素然后松开
drag_and_drop(source,target)           

# 拖拽到某个坐标然后松开
drag_and_drop_by_offset(source,xoffset,yoffset) 

# 按下键盘上的某个键
key_down(value,element=None)   

# 松开键盘上的某个键
key_up(value, element=None)      

# 鼠标从当前位置移动到某个坐标
move_by_offset(xoffset, yoffset)  

# 鼠标移动到某个元素
move_to_element(to_element)        

# 移动到距某个元素（左上角坐标）多少距离的位置
move_to_element_with_offset(to_element, xoffset, yoffset) 

# 暂停所有输入(指定持续时间以秒为单位)
pause(seconds)        

# 执行所有操作
perform()                       

# 结束已经存在的操作并重置
reset_actions()         

# 在某个元素位置松开鼠标左键
release(on_element=None)       

# 发送某个键或者输入文本到当前焦点的元素
send_keys(*keys_to_send)       

# 发送某个键到指定元素
send_keys_to_element(element, *keys_to_send)
'''

# 【三】动作链创建模版
# 【1】导入模块
from selenium.webdriver import ActionChains

# 【2】生成动作链对象
# 参数就是你当前生成的浏览器对象
actions = ActionChains()

# 【3】选择合适的动作
# 起始的元素标签对象,目标元素标签对象
actions.drag_and_drop()

# 【4】执行动作
actions.perform()
